home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1997 May / EnigmA AMIGA RUN 18 (1997)(G.R. Edizioni)(IT)[!][issue 1997-05][EAR-CD II].iso / earcd / misc / emu / arosdev.lha / AROS / rom / exec / waitio.c < prev    next >
C/C++ Source or Header  |  1997-01-09  |  3KB  |  107 lines

  1. /*
  2.     (C) 1995-96 AROS - The Amiga Replacement OS
  3.     $Id: waitio.c,v 1.7 1997/01/01 03:46:18 ldp Exp $
  4.     $Log: waitio.c,v $
  5.     Revision 1.7  1997/01/01 03:46:18  ldp
  6.     Committed Amiga native (support) code
  7.  
  8.     Changed clib to proto
  9.  
  10.     Revision 1.6  1996/12/10 13:51:55  aros
  11.     Moved all #include's in the first column so makedepend can see it.
  12.  
  13.     Revision 1.5  1996/10/24 15:50:59  aros
  14.     Use the official AROS macros over the __AROS versions.
  15.  
  16.     Revision 1.4  1996/08/13 13:56:09  digulla
  17.     Replaced AROS_LA by AROS_LHA
  18.     Replaced some AROS_LH*I by AROS_LH*
  19.     Sorted and added includes
  20.  
  21.     Revision 1.3  1996/08/01 17:41:22  digulla
  22.     Added standard header for all files
  23.  
  24.     Desc:
  25.     Lang: english
  26. */
  27. #include <exec/execbase.h>
  28. #include <exec/io.h>
  29. #include <aros/libcall.h>
  30. #include <proto/exec.h>
  31.  
  32. /*****************************************************************************
  33.  
  34.     NAME */
  35.  
  36.     AROS_LH1(BYTE, WaitIO,
  37.  
  38. /*  SYNOPSIS */
  39.     AROS_LHA(struct IORequest *, iORequest, A1),
  40.  
  41. /*  LOCATION */
  42.     struct ExecBase *, SysBase, 79, Exec)
  43.  
  44. /*  FUNCTION
  45.     Waits until the I/O request is completed and removes it from the
  46.     reply port. If the message is already done when calling this function
  47.     it doesn't wait but just remove the message.
  48.  
  49.     INPUTS
  50.     iORequest - Pointer to iorequest structure.
  51.  
  52.     RESULT
  53.     Error state of I/O request.
  54.  
  55.     NOTES
  56.  
  57.     EXAMPLE
  58.  
  59.     BUGS
  60.  
  61.     SEE ALSO
  62.     OpenDevice(), CloseDevice(), DoIO(), SendIO(), AbortIO(), CheckIO()
  63.  
  64.     INTERNALS
  65.  
  66.     HISTORY
  67.  
  68. ******************************************************************************/
  69. {
  70.     AROS_LIBFUNC_INIT
  71.  
  72.     /*
  73.     The I/O request is still in use if it wasn't done quick
  74.     and isn't yet replied (ln_Type==NT_MESSAGE).
  75.     If it is still in use wait until it is complete.
  76.     Note the the port may be used for other things as well - so
  77.     don't just wait but repeat the check.
  78.     */
  79.     while(!(iORequest->io_Flags&IOF_QUICK)&&
  80.       iORequest->io_Message.mn_Node.ln_Type==NT_MESSAGE)
  81.     /*
  82.         Wait at the reply port. Don't use WaitPort() - there may
  83.         already be other messages waiting at it.
  84.     */
  85.     Wait(1<<iORequest->io_Message.mn_ReplyPort->mp_SigBit);
  86.  
  87.     /*
  88.     If ln_Type is NT_REPLYMSG the I/O request must be removed from
  89.     the replyport's waiting queue.
  90.     */
  91.     if(iORequest->io_Message.mn_Node.ln_Type==NT_REPLYMSG)
  92.     {
  93.     /* Arbitrate for the message queue. */
  94.     Disable();
  95.  
  96.     /* Remove the message */
  97.     Remove(&iORequest->io_Message.mn_Node);
  98.     Enable();
  99.     }
  100.  
  101.     /* All done. Get returncode. */
  102.     return iORequest->io_Error;
  103.  
  104.     AROS_LIBFUNC_EXIT
  105. } /* WaitIO */
  106.  
  107.